#ifndef VIDEOOPERATION_H
#define VIDEOOPERATION_H

#include <QObject>
#include <QMap>
class   QSqlQuery;
class QTimer;
class WeatherStation;
class QUdpSocket;
class StatusOperation : public QObject
{
    Q_OBJECT
public:
    explicit StatusOperation(QObject *parent = 0);

    //对到来的节点信息包进行处理。
    void analyNodeInfoPacket(QByteArray &data,qint64 macAddr);

    //对到来的心跳包进行处理。
    bool   analyHeartPakcet(QByteArray  &data,qint64 parMacAddr);
    //对节点到来的查询包进行处理
    void analyQuerySensorInfo(QByteArray &data, qint64 paramMacAddr);

    //该函数把mac信息记录到数据库中
    void    doWithMac(qint64  &macAddr);
    void    doWithSensor(qint64  macAddr,quint8 sensorID);
    void doWithExpiredMac(qint64 addr); //某个mac对应的TTL到达了0，进行处理
    void  doWithExpiredSensor(qint64 addr,quint8 sensorID);
    //该函数把传感器配置信息记录到数据库中，然后从data中删除掉这块数据
    void    doWithSensorInfo(QByteArray &data,qint64  macAddr);


    //更新NodeSensorMap表中的sensorOnWork这一项
    void    setSensorOnWorkInNodeSenMap(qint64 mac,quint8 sensorID);

   QString  sourceV4IP; //记录当前正在处理的数据包的源IP
   quint16  sourcePort;  //源端口
   QByteArray curHexProtocHead; //当前网关接口协议的同步头。

   /*addrSocketMap用于保存mac地址和Socket的对应关系。
           */
   QMap<qint64,QString> addrSocketMap;//mac地址和socket的映射
   void insertAddrSocketMap(qint64 addr,QString IPPort);//IPPort举例“10.21.10.5:6752”

   /*
    addrTTLMap用于保存mac地址和该地址的TTL的映射关系。
    TTL是为了用于记录某个网关节点是否处于活动状态。在物联网平台中，有个
    1s定时器，定时对TTL减一。如果某个网关节点发送了一个心跳包，则把对应的
    TTL设置为最大值。当某个TTL减到0以后，认为对应的网关节点已经不可控，去除
    addrSocketMap中的对应记录，并对数据库作相应的更新。
    TTL的最大值TTL_MAX在macro.h中定义
    */
   QMap<qint64,qint16>  addrTTLMap;
   QMap<QByteArray,qint16>  addrSensorTTLMap;//记录传感器的活动状态
   void insertAddrTTLMap(qint64 addr,qint16 TTL); //插入一项
   void removeAddrTTLMap(qint64 addr); //删除一项
   void updateAddrTTLMap(qint64 addr,qint16 TTL);  //更新一项

   void updateAddrSensorTTLMap(QByteArray baMacAddr,qint16 TTL);

   void    initTableNameList();
   void    initTimer();
   QList <QString> tableNameList;
   QString tableNamePrefix;
   QList <qint64>  newMacList;  //还没有上传过视频，但是发送过配置包的mac列表

signals:
   //该信号和DOBInThread类里的对应槽函数连接
   void sigRegNode(qint64  nodeMacAddr,QByteArray nodeName,qint8 nodeOnWork,QByteArray nodeV4IP,
           quint16 nodeV4Port,QByteArray nodeType,QByteArray protocHead,qint8 nodeOccupied);
   void sigUnRegNode(qint64  nodeMacAddr);

   //该信号和DOBInThread类里的对应槽函数连接
   void sigRegSensor(qint64 nodeMacAddr,qint16 sensorID,qint8 sensorOnWork);
   void sigUnRegSensor(qint64 nodeMacAddr,qint16 sensorID,qint8 sensorOnWork);

   void sigDeleteNode(qint64  nodeMacAddr,QByteArray nodeName);
   void sigQueryPin(qint64 nodeMacAddr);
   void sigRemoveOneInControllingMacList(QString macStr);

public slots:
   void myTimerEvent();
   void timerEventForTTL();

private:

   WeatherStation* parentWeathSta;
   QTimer *timer;

   QTimer  *timerForTTL;  //用于更新TTL值的计时器
};

#endif // VIDEOOPERATION_H
